#include "AVPacketManager.h"
#include <stdexcept>

AVPacketManager::AVPacketManager() : serial(0), duration(0) {}

AVPacketManager::~AVPacketManager() {
    flush();
}

// 数据包队列初始化
// 返回值：成功返回 0，否则返回错误号
int AVPacketManager::init() {
    packet_queue.clear();
    duration = 0;
    serial = 0;
    return 0;
}

// 向队列中添加一个 AVPacket
// 参数：
//   pkt：要添加的 AVPacket
// 返回值：成功返回 0，否则返回 -1
int AVPacketManager::put(AVPacket *pkt) {
    if (!pkt) {
        throw std::invalid_argument("Invalid AVPacket pointer");
    }

    std::shared_ptr<MyAVPacketList> pkt_list = std::make_shared<MyAVPacketList>();
    if (av_packet_ref(&pkt_list->pkt, pkt) < 0) {
        return -1;
    }
    pkt_list->serial = serial;

    duration += pkt->duration;
    packet_queue.push(pkt_list);
    return 0;
}



// 从队列中获取一个 AVPacket
// 参数：
//   pkt：用于保存获取到的 AVPacket
// 返回值：成功返回 1，队列为空返回 0，其他情况返回 -1
int AVPacketManager::get(AVPacket *pkt, std::chrono::microseconds timeout) {
    if (!pkt) {
        throw std::invalid_argument("Invalid AVPacket pointer");
    }

    std::shared_ptr<MyAVPacketList> pkt_list;
    bool success = packet_queue.try_wait_and_pop(pkt_list,timeout);
    if (success) {
        if (av_packet_ref(pkt, &pkt_list->pkt) < 0) {
            return -1;
        }
        duration -= pkt_list->pkt.duration;
        av_packet_unref(&pkt_list->pkt); // 调整引用计数
        return 0;
    } else {
        return 1;
    }
}


// 清空队列
// 清空队列
void AVPacketManager::flush() {
    packet_queue.clear();
    duration = 0;
    serial = -1;
}

// 设置是否终止队列操作，用于安全快速退出播放
// 参数：
//   value：是否终止队列操作
void AVPacketManager::set_abort_request(bool value) {
    packet_queue.set_abort_request(value);
}


